﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TISModel;
using BTO;
using DAL;
using Exceptions;


namespace BLL
{
    public class BLLTipoAlojamento
    {
        public List<BTO.TipoAlojamento> list()
        {
            DALTipoAlojamento tipoAlojamentos = new DALTipoAlojamento();
            List<BTO.TipoAlojamento> btoTipoAlojamento = tipoAlojamentos.list();
            if (btoTipoAlojamento.Count() == 0)
            {
                throw new NotFoundCategoriaException("Nao existem tipos de alojamento registados.");
            }
            return btoTipoAlojamento;
        }

        public BTO.TipoAlojamento getByID(int id)
        {
            DALTipoAlojamento dalTipoAlojamento = new DALTipoAlojamento();
            BTO.TipoAlojamento btoTipoAlojamento = dalTipoAlojamento.getByID(id);

            if (btoTipoAlojamento == null) {
                throw new NotFoundTipoAlojamentoException("Tipo de alojamento não encontrado");
            }
            
            return btoTipoAlojamento;
        }

        public BTO.TipoAlojamento getByDescricao(String descricao)
        {
            DALTipoAlojamento dalTipoAlojamento = new DALTipoAlojamento();
            BTO.TipoAlojamento btoTipoAlojamento = dalTipoAlojamento.getByDescricao(descricao);

            if (btoTipoAlojamento == null)
            {
                throw new NotFoundTipoAlojamentoException("Tipo de alojamento com esta descricao não encontrado");
            }

            return btoTipoAlojamento;
        }

        public void insert(BTO.TipoAlojamento toInsert)
        {
            DALTipoAlojamento dalTipoAlojamento = new DALTipoAlojamento();

            BTO.TipoAlojamento btoTipoAlojamento = dalTipoAlojamento.getByDescricao(toInsert.descricao);
            if (btoTipoAlojamento != null)
            {
                throw new DescricaoTipoAlojamentoException("Já existe um tipo de alojamento com esta decrição!");
            }

            try
            {
                dalTipoAlojamento.insert(toInsert);
            }
            catch (Exception e) {
                throw new InsertTipoAlojamentoException(e.Message);
            }
        }

        public void update(BTO.TipoAlojamento toUpdate)
        {
            DALTipoAlojamento dalTipoAlojamento = new DALTipoAlojamento();

            try
            {
                dalTipoAlojamento.update(toUpdate);
            }
            catch (Exception e) {
                throw new UpdateTipoAlojamentoException(e.Message);
            }
        }

        public void delete(int id)
        {
            DALTipoAlojamento dalTipoAlojamento = new DALTipoAlojamento();
            DALAlojamento dalAlojamento = new DALAlojamento();

            List<BTO.Alojamento> listAlojamento = dalAlojamento.getByTipoAlojamento(id);
            if (listAlojamento.Count() > 0)
            {
                throw new AlojamentosAssociadosTipoException("Existem Alojamentos associados à este tipo!");
            }

            try
            {
                dalTipoAlojamento.delete(id);
            }
            catch (Exception e) {
                throw new DeleteTipoAlojamentoException(e.Message);
            }
        }
    }
}
